package day12;

import java.util.concurrent.locks.ReentrantLock;

/**
 * @author: 王丹
 * @create: 2021-07-03 16:58
 * <p>
 * synchronized关键字默认是有jvm内部实现控制的，是非公平锁。
 * 而ReentrantLock运行开发者自己设置锁的公平性。
 * public ReentrantLock(boolean fair) {
 * sync = fair ? new FairSync() : new NonfairSync();
 * }
 * 当fair为true的时候创建的是公平锁，公平锁看起来很不错，不过要实现公平锁，
 * 系统内部肯定需要维护一个有序队列，因此公平锁的实现成本比较高，性能相对于非公平锁来说相对低一些。
 * 因此，在默认情况下，锁是非公平的，如果没有特别要求，则不建议使用公平锁。
 **/
public class Demo5 {

    //true代表公平锁，false代表非公平锁
    public static ReentrantLock reentrantLock = new ReentrantLock(false);

    public static class T extends Thread {
        public T(String name) {
            super(name);
        }

        public void run() {
            for (int i = 0; i < 5; i++) {
                reentrantLock.lock();
                try {
                    System.out.println(this.getName() + "获得锁");
                } finally {
                    reentrantLock.unlock();
                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        T t1 = new T("t1");
        T t2 = new T("t2");
        T t3 = new T("t3");

        t1.start();
        t2.start();
        t3.start();

        t1.join();
        t2.join();
        t3.join();

    }
}
